const multer = require("multer")
const path = require("path")
//引入token验证模块
const jwt = require("jsonwebtoken");
//引入加密模块
const crypto = require('crypto');

let SECRET_KEY="mykey"

let storage = multer.diskStorage({
    // 配置文件上传后存储的路径
    destination: function (req, file, cb) {
        // NodeJS的两个全局变量
        // console.log(__dirname);  //获取当前文件在服务器上的完整目录 
        // console.log(__filename); //获取当前文件在服务器上的完整路径 
        cb(null, path.join(__dirname, '../public/uploads'))
    },
    // 配置文件上传后存储的路径和文件名
    filename: function (req, file, cb) {
        console.log('file', file);
        cb(null, Date.now() + '-' + file.originalname)
    }
})
let upload = multer({ storage: storage })
let dateFormat = function (date, fmt) {
    var o = {
        "M+": date.getMonth() + 1, //月份
        "d+": date.getDate(), //日
        "H+": date.getHours(), //小时
        "m+": date.getMinutes(), //分
        "s+": date.getSeconds(), //秒
        "q+": Math.floor((date.getMonth() + 3) / 3), //季度
        "S": date.getMilliseconds() //毫秒
    };
    if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (var k in o)
        if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    return fmt;
}

function tranListToTreeData(list) {
    // 1. 定义两个变量
    const treeList = [], map = {}

    // 2. 建立一个映射关系，并给每个元素补充children属性.
    // 映射关系: 目的是让我们能通过id快速找到对应的元素
    // 补充children：让后边的计算更方便
    list.forEach(item => {
        if (!item.children) {
            item.children = []
        }
        map[item.id] = item
    })

    // 循环
    list.forEach(item => {
        // 对于每一个元素来说，先找它的上级
        //    如果能找到，说明它有上级，则要把它添加到上级的children中去
        //    如果找不到，说明它没有上级，直接添加到 treeList
        const parent = map[item.parentId]
        // 如果存在上级则表示item不是最顶层的数据
        if (parent) {
            parent.children.push(item)
        } else if (item.parentId === 0) {
            // 如果不存在上级 则是顶层数据,直接添加
            treeList.push(item)
        }
    })
    // 返回
    return treeList
}

//用户密码加盐加密验证
function encrypt(name, str) {
    let salt = name + 'add my salt';
    let obj = crypto.createHash('md5');
    obj.update(str + salt);
    let password = obj.digest('hex');
    return password;
}

//jsonwebtoken加密token
function encodeJwt(content) {
    let secretOrPrivateKey = "mykey";// 这是加密的key（密钥） 
    let token = jwt.sign(content, secretOrPrivateKey, {
        expiresIn: 60*60*24  // 24小时过期 60*60*24,可以设置为10秒来测试JWT是否生效
    });
    // console.log("token ：" +token );
    return token;
}

module.exports = {
    upload,
    dateFormat,
    tranListToTreeData,
    encrypt,
    encodeJwt,
    SECRET_KEY
}